package br.com.cast.syscast.persistencia;

import java.util.Iterator;
import java.util.List;

import javax.persistence.Query;

import org.springframework.stereotype.Component;

import br.com.cast.syscast.models.Pais;

@Component 
public class PaisDAO extends DAOBase {
	
	public PaisDAO() {
	}
	
	@SuppressWarnings("unchecked")
	public Iterator<Pais> consultaPaginada(long inicio, long total) {
		
		Query query = getEntityManager()
				.createQuery("FROM Pais");
		
		query.setFirstResult((int) inicio);
		query.setMaxResults((int)total);
		
		return query.getResultList().iterator();
	}
	
	public void salvar(Pais pais) {
		getEntityManager().persist(pais);
	}
	
	public void alterar(Pais pais) {
		getEntityManager().merge(pais);
	}
	
	public long total() {
		StringBuilder hql = new StringBuilder();
		
		hql.append("SELECT COUNT(*) as total ")
		   .append("FROM Pais");
		
		Query query = getEntityManager()
				.createQuery(hql.toString());

		return (long) query.getSingleResult();
	}
	
	//devemos receber o objeto Pais
	public void excluir(Pais pais) {
		
		pais = (Pais) getHibernateCurrentSession()
			.get(Pais.class, pais.getId());
		getEntityManager().remove(pais);
	}

	public boolean paisJaCadastrado(Pais pais) {
		
		StringBuilder hql = new StringBuilder();
		
		hql.append("SELECT COUNT(*) as qtd ")
		   .append("FROM Pais ")
		   .append("WHERE nome = :nome");
		
		if (pais.getId() != null) {//alteração
			//tem que existir um país que não seja ele mesmo
			//com o mesmo nome.
			//esse AND faz com que sejam verificados somente os outros países 
			//no fluxo de alteração
			hql.append(" AND id <> :id ");
		}

		Query query = getEntityManager()
				.createQuery(hql.toString());
			
		query.setParameter("nome", pais.getNome());
		
		if (pais.getId() != null) {//alteração
			query.setParameter("id", pais.getId());
		}
		
		return (long)query.getSingleResult() > 0;
	}

	public List<Pais> consultaTodos() {
		return getEntityManager()
			.createQuery("FROM Pais")
			.getResultList();
	}
	
}
